#include "stm32f10x.h"                  // Device header
#include "Motor.h"
#include "PWM.h"
#include "Encoder.h"

// 使用全局配置
extern MotorCtrl_t MotorCtrls[];
extern const uint8_t MOTOR_CTRL_COUNT;

//// TB6612配置数组
//MotorCtrl_t MotorCtrls[] = {
//    // 电机A: IN1(PB12), IN2(PB13)
//    {GPIOB, GPIO_Pin_12, GPIO_Pin_13},// 左电机
//                                      
//    // 电机B: IN1(PB14), IN2(PB15)      
//    {GPIOB, GPIO_Pin_14, GPIO_Pin_15} // 右电机
//};
//// 编码器数量
//#define MOTOR_CTRL_COUNT (sizeof(MotorCtrls)/sizeof(MotorCtrls[0]))

/**
  * 函    数：直流电机初始化
  * 参    数：无
  * 返 回 值：无
  */
void Motor_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 1. 时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 2. GPIO配置 (推挽输出)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    for(uint8_t i = 0; i < MOTOR_CTRL_COUNT; i++) {
        GPIO_InitStructure.GPIO_Pin = MotorCtrls[i].IN1_Pin | MotorCtrls[i].IN2_Pin;
        GPIO_Init(MotorCtrls[i].GPIOx, &GPIO_InitStructure);
        
        // 初始状态停止
        GPIO_WriteBit(MotorCtrls[i].GPIOx, MotorCtrls[i].IN1_Pin, Bit_RESET);
        GPIO_WriteBit(MotorCtrls[i].GPIOx, MotorCtrls[i].IN2_Pin, Bit_RESET);
    }
    
    // 3. 初始化PWM
    PWM_Init();
}

/**
  * 函    数：直流电机设置PWM
  * 参    数：PWM 要设置的PWM值，范围：-100~100（负数为反转）
  * 返 回 值：无
  */
void Motor_SetPWM(int8_t Motor, float PWM)
{
	if (PWM >= 0)							//如果设置正转的PWM
	{
		GPIO_WriteBit(MotorCtrls[Motor].GPIOx, MotorCtrls[Motor].IN1_Pin, Bit_RESET);
        GPIO_WriteBit(MotorCtrls[Motor].GPIOx, MotorCtrls[Motor].IN2_Pin, Bit_SET);
		PWM_SetDuty(Motor, PWM);
	}
	else									//否则，即设置反转的速度值
	{
		GPIO_WriteBit(MotorCtrls[Motor].GPIOx, MotorCtrls[Motor].IN1_Pin, Bit_SET);
        GPIO_WriteBit(MotorCtrls[Motor].GPIOx, MotorCtrls[Motor].IN2_Pin, Bit_RESET);
		PWM_SetDuty(Motor, -PWM);
	}
	
}
